package Classes;

import java.util.ArrayList;
import java.util.Iterator;

/**
 * 
 * @author JAVA - LI
 *
 */
public class RepositorioDeUsuarios {
	ArrayList<Usuario> usuarios;
	
	/**
	 * Cria um objeto da classe RepositorioDeUsuarios.
	 */
	public RepositorioDeUsuarios(){
		usuarios = new ArrayList<Usuario>();
	}
	
	/**
	 * Retorna um boolean, adicionando um usuario ao repositorio de usuarios.
	 * @param usuario Usuario que deseja adicionar ao repositorio.
	 * @return true quando o usuario e adicionado.
	 */
	public boolean adicionaUsuario(Usuario usuario){
		usuarios.add(usuario);
		return true;
	}
	
	/**
	 * Remove um usuario do repositorio pelo indice passado.
	 * @param numero O indice do usuario a ser removido.
	 * @throws Exception Lanca excessao se o indice passado for menor que 0 ou for maior ou igual ao tamanho do repositorio
	 */
	public void removePorIndice(int numero) throws Exception{
		if((numero<0)||(numero>=usuarios.size())){
			throw new Exception("indice nao existe!");
		}
		usuarios.remove(numero);
		
	}
	
	/**
	 * Remove um usuario e retorna o usuario removido.
	 * @param usuario O objeto usuario a ser removido.
	 * @return O usuario removido.
	 */
	public Usuario removePorObj(Usuario usuario){
		Iterator<Usuario> it = usuarios.iterator();
		while(it.hasNext()){
			Usuario user = it.next();
			if(usuario.equals(user)){
				usuarios.remove(user);
				return user;
			}
		}
		return null;
	}
	
	/**
	 * Retorna o usuario que tem determinado nome.
	 * @param nome Nome do usuario a ser retornado.
	 * @return Usuario.
	 */
	public Usuario getUsuario(String nome){
		Iterator<Usuario> it = usuarios.iterator();
		while(it.hasNext()){
			Usuario usuario = it.next();
			if(usuario.getNome().equals(nome)){
				return usuario;
			}
		}
		return null;
	}
	
	/**
	 * Retorna o usuario de determinado indice.
	 * @param numero O indice do usuario a ser retornado.
	 * @return O usuario de determinado indice.
	 * @throws Exception Lanca excessao se o indice passado for menor que 0 ou for maior ou igual ao tamanho do repositorio.
	 */
	public Usuario getUsuarioPorIndice(int numero) throws Exception{
		if((numero<0)||(numero>=usuarios.size())){
			throw new Exception("indice nao existe!");
		}
		return usuarios.get(numero);
	}
	
	/**
	 * Retorna o repositorio de usuarios.
	 * @return O repositorio de usuarios.
	 */
	public ArrayList<Usuario> getUsuarios(){
		return usuarios;
	}
	
	@Override
	/**
	 * Retorna um inteiro simbolizando o endereco de memoria.
	 */
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result
				+ ((usuarios == null) ? 0 : usuarios.hashCode());
		return result;
	}
	
	@Override
	/**
	 * Retorna um boolean comparando se dois objetos forem iguais.
	 */
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		RepositorioDeUsuarios other = (RepositorioDeUsuarios) obj;
		if (usuarios == null) {
			if (other.usuarios != null)
				return false;
		} else if (!usuarios.equals(other.usuarios))
			return false;
		return true;
	}
}
